﻿using System;
using System.Collections.Generic;
namespace DSL
{
    class DSLListener:DSLBaseListener
    {
        public List<StatementData>  statementDatas;

        private Stack<FunctionData> m_CurFunctionDataStack;
        private StatementData m_CurStatementData;
        private FunctionData m_CurFunctionData
        {
            get
            {
                return m_CurFunctionDataStack.Count > 0 ? m_CurFunctionDataStack.Peek() : null;
            }
        }
        private FunctionCallData m_CurFunctionCallData;

        public override void EnterFile(DSLParser.FileContext context)
        {
            statementDatas = new List<StatementData>();
            m_CurFunctionDataStack = new Stack<FunctionData>();
        }

        public override void EnterFunction(DSLParser.FunctionContext context)
        {
            var functionData = new FunctionData();
            functionData.SetLine(context.Start.Line);

            m_CurFunctionDataStack.Push(functionData);
            m_CurStatementData.SetFunctionData(m_CurFunctionData);
        }

        public override void ExitFunction(DSLParser.FunctionContext context)
        {
            m_CurFunctionDataStack.Pop();
        }

        public override void EnterFunctionCall(DSLParser.FunctionCallContext context)
        {
            m_CurFunctionCallData = new FunctionCallData();
            m_CurFunctionCallData.SetLine(context.Start.Line);
            m_CurFunctionCallData.SetId(context.ID().GetText());
            m_CurFunctionData.SetId(context.ID().GetText());

            m_CurFunctionData.SetFunctionCallData(m_CurFunctionCallData);
        }

        public override void EnterParameter(DSLParser.ParameterContext context)
        {
            var valueData = new ValueData();
            valueData.SetLine(context.Start.Line);
            if (context.ID() != null)
            {
                valueData.SetProperty(context.ID().GetText());
            }
            else if (context.NUMBER() != null)
            {
                valueData.SetNum(context.NUMBER().GetText());
            }
            else if (context.STRING() != null)
            {
                valueData.SetString(context.STRING().GetText());
            }
            else if (context.GetText() == "true")
            {
                valueData.SetBool(true);
            }
            else
            {
                valueData.SetBool(false);
            }

            m_CurFunctionCallData.AddParam(valueData);
            valueData.SetString(context.GetText());
        }

        public override void EnterStatement(DSLParser.StatementContext context)
        {
            m_CurStatementData = new StatementData();
            m_CurStatementData.SetLine(context.Start.Line);

            if (m_CurFunctionData == null)
            {
                statementDatas.Add(m_CurStatementData);
            }
            else
            {
                m_CurFunctionData.AddStatement(m_CurStatementData);
            }
        }

        public override void ExitStatement(DSLParser.StatementContext context)
        {
            m_CurStatementData = null;
        }
    }
}
